package com.gdepri.cabelwellserver.handler;

import com.gdepri.cabelwellserver.entity.CabelMessage;
import com.gdepri.cabelwellserver.tools.ByteFun;
import com.github.misterchangray.core.util.ConverterUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

//负责将ByteArr转化成对象
public class ByteMsgDecoder {
    ByteFun byteFun = new ByteFun();
    private Logger logger = LoggerFactory.getLogger(ByteMsgDecoder.class);
    public CabelMessage decode(byte[] byteArr){
        CabelMessage cabelMessage = new CabelMessage();
        if(byteArr!=null && byteArr.length>0) {
            //开始解析报文
            //logger.info("当前报文的长度为"+byteArr.length+"字节,其中固定8字节,数据长度应该为"+(byteArr.length-8)+"字节");
            byte startWord = byteArr[0];//第一部分,起始字
            int length = byteFun.findLenByteArrFromMsgByteArr(byteArr);//第二部分，长度，2字节
            int dataLength = length - 3;//数据的长度为length-3,3包括了控制字和字节

            //第三部分控制字
            byte control = byteArr[3];
            String controlStr = byteFun.pasreByte2Binary(control);
            String direction = controlStr.substring(0, 1);
            int packNum = Integer.parseInt(controlStr.substring(1, 3), 2);
            int funcCode = Integer.parseInt(controlStr.substring(3, 8), 2);

            //第四部分 地址
            int address = byteFun.findAddressByteArrFromMsgByteArr(byteArr);

            //第五部分 数据
            byte[] data = byteFun.findDataByteArrFromMsgByteArr(byteArr, dataLength);

            //第六部分 校验码
            byte checkCode = byteArr[byteArr.length - 2];//第六部分,校验字
            byte endWord = byteArr[byteArr.length - 1];//第七部分,结束字

            logger.info("-----------------------");
            logger.info("startWord:"+startWord);
            logger.info("length:"+length);
            logger.info("dataLen:"+dataLength);
            logger.info("control:"+control);
            logger.info("controlStr:"+controlStr);
            logger.info("direction:"+direction);
            logger.info("packNum:"+packNum);
            logger.info("funcCode:"+funcCode);
            logger.info("address:"+address);
            logger.info("data:"+data);
            logger.info("checkCode:"+checkCode);
            logger.info("endWord:"+endWord);
            logger.info("16进制的报文"+byteFun.print16ByteArr(byteArr));
            logger.info("16进制的报文"+byteFun.print16ByteArrByLength(byteArr,dataLength));
            logger.info("-----------------------");

            cabelMessage.setStartWord(startWord);
            cabelMessage.setLength(length);
            cabelMessage.setDataLength(dataLength);
            cabelMessage.setDirection(direction);
            cabelMessage.setPackNum(packNum);
            cabelMessage.setFuncCode(funcCode);
            cabelMessage.setAddress(address);
            cabelMessage.setData(data);
            cabelMessage.setCheckCode(checkCode);
            cabelMessage.setEndWord(endWord);
            logger.info(String.valueOf(cabelMessage));
        }
        return cabelMessage;
    }


//    /**
//     * 从一个完整的报文数组中,找到关于长度的报文,也就是位于第1个字节之后的连续2个字节,表示长度。长度是3+N,
//     * 其中3是控制字(2字节)+地址(1字节),N是数据的长度
//     * @param msgByteArr 一个完整的报文数组
//     * @return 长度的int值
//     */
//    public  int findLenByteArrFromMsgByteArr(byte[] msgByteArr){
//        byte[] lengthByteArr = new byte[2];//剩下的数组的长度
//        System.arraycopy(msgByteArr,1,lengthByteArr,0,2);
//        String s = pasreByte2Binary(lengthByteArr);
//        logger.info("长度的二进制"+s);
//        int lenth = Integer.parseInt(s, 2);
//        logger.info("长度"+lenth);
//        return lenth;
//    }
//
//
//    /**
//     * 把字节数组转换为2进制,传入的参数中,其中的每个byte表示一个字节，也就是8位的比特。
//     * 如果传进来一个2字节的byte数组,那么就会得到一个16位的2进制数组
//     * @param ctrl byte数组
//     * @return
//     */
//    public static String pasreByte2Binary(byte[] ctrl){
//        StringBuffer sb = new StringBuffer();
//        for(int i=0;i<ctrl.length;i++){
//            sb.append(String.format("%8s", Integer.toBinaryString(ctrl[i] & 0xFF)).replace(' ', '0'));
//        }
//        return sb.toString();
//    }
//
//    /**
//     * 以16进制打印byte数组
//     * @param arr
//     */
//    public  String print16ByteArr(byte[] arr){
//        String s = ConverterUtil.byteToHexString(arr);
//        StringBuffer sb = new StringBuffer();
//        for(int i=0;i<s.length();i++){
//            sb.append(s.charAt(i));
//            if(i%2!=0){
//                sb.append(" ");
//            }
//        }
//        return sb.toString();
//    }
//
//    /**
//     * 专属打印,打印16进制的报文
//     * @param arr
//     */
//    public  String print16ByteArrByLength(byte[] arr,int n){
//        String s = ConverterUtil.byteToHexString(arr);
//        int count = 0;
//        StringBuffer sb = new StringBuffer();
//        sb.append(" 起始字");
//        for(int i=0;i<s.length();i++){
//            sb.append(s.charAt(i));
//            if(i%2!=0){
//                sb.append(" ");
//                count++;
//                if(count==1){
//                    sb.append(" 长度");
//                }else if (count==3){
//                    sb.append(" 控制字");
//                }else if (count==4){
//                    sb.append(" 地址");
//                }else if (count==6){
//                    sb.append(" 数据");
//                }else if (count==6+n){
//                    sb.append(" 校验码");
//                }else if (count==7+n){
//                    sb.append(" 结束符");
//                }
//            }
//        }
//        return sb.toString();
//    }
//
//    /**
//     * 单个的字节转换成8位二进制字符串
//     * @param ctrl 单个的字节
//     * @return
//     */
//    public static String pasreByte2Binary(byte ctrl){
//        StringBuffer sb = new StringBuffer();
//        sb.append(String.format("%8s", Integer.toBinaryString(ctrl & 0xFF)).replace(' ', '0'));
//        return sb.toString();
//    }
//
//    /**
//     * 根据传入大小为2的byte数组,来解析出值
//     * @param msgByteArr
//     * @return
//     */
//    public  int findAddressByteArrFromMsgByteArr(byte[] msgByteArr){
//        byte[] addressByteArr = new byte[2];//剩下的数组的长度
//        System.arraycopy(msgByteArr,4,addressByteArr,0,2);
//        String s = pasreByte2Binary(addressByteArr);
//        logger.info("地址的二进制"+s);
//        int address = Integer.parseInt(s, 2);
//        logger.info("  地址"+address);
//        return address;
//    }
//
//    /**
//     * 从报文中找到数据的部分，返回
//     * @param msgByteArr 完整的消息报文
//     * @param datalength 数据的byte
//     * @return
//     */
//    public static byte[] findDataByteArrFromMsgByteArr(byte[] msgByteArr,int datalength){
//        byte[] dataByteArr = new byte[datalength];
//        System.arraycopy(msgByteArr,6,dataByteArr,0,datalength);
//        return dataByteArr;
//    }
}
